Elettronica Forex Informatica Motori _vti_cnf | ||
|
Rivelatore Acqua Antiallagamento
Il circuito si avvale di un sensore a immersione nell'acqua di tipo a resistività formato
da 4 contatti a immersione: comune, minimo, massimo e emergenza. Il microcontrollore usato è un PIC 16f819;
Il principio di funzionamento è il seguente: appena il livello tocca il contatto del massimo
parte la pompa comandata attraverso un relè fintanto che non scende al di sotto del livello di
minimo. Il tempo di accensione della pompa può durare al max 50 secondi con uno stop di 15 secondi.
Il circuito riconosce anche il bloccaggio della pompa attraverso una porta analogica del microcontrollore
su un piccolo avvolgimento di 7-8 spire con diametro di c.a. 1 centimetro e di sezione piccola quali ad
esempio filo di cavo di rete. La pompa funziona a 12v ed è attivata da un relè. Il sistema dispone di 3 spie
una verde che lampeggia ad intervallo di un secondo per indicare il corretto funzionamento del sistema,
una gialla che indica quando si attacca la pompa e una rossa che indica il sovra assorbimento. In caso di sovra
assorbimento (mediante due test sfalzati di un secondo) si ha il bloccaggio del motore entro 2 secondi e passati
10 secondi si procede a far ripartire il motore con la speranza che ciò che ha creato il blocco non è più predente
grazie al colpo dato in partenza dal motore. Se viene toccato il sensore di emergenza, viene attivato un'uscita pilotata
da transistor che permette il comando di un indicatore lampeggiante o sirena. Per la compilazione del programma ci si può avvalere di MikroC.
Codice sorgente
#define livellobatteria 0 //channel 0 porta analogica #define assorbimento 1 //channel
1 porta analogica #define min PORTB.F7 #define max PORTB.F6 #define emerg PORTB.F5
#define pompa PORTB.F3 #define lampeggiante PORTB.F2 #define batteriacarica 500
//max 1024 #define maxassorbimento 500 //max 1024 #define maxtempopompaon 30 //in
secondi unsigned char tempopompa,tempolampeggiante,controlloaggiuntivo; void interrupt(){
if (INTCON.RBIF==1){ //interrupt da cambiamento stato PORTB INTCON.RBIF==0; if (max==1
|| emerg==1){ //accensione pompa controlloaggiuntivo=0; tempopompa=0; pompa=1; lampeggiante=1;
} if (max==0 && emerg==0) lampeggiante=0; if (min==0 && max==0){
//spegnimento pompa controlloaggiuntivo=0; tempopompa=0; pompa=0; lampeggiante=0;
} } if (PIR1.TMR2IF==1){ PIR1.TMR2IF=0; if (pompa==1) tempopompa++; else tempopompa=0;
if (lampeggiante==1) tempolampeggiante++; else tempolampeggiante=0; controlloaggiuntivo++;
} } unsigned int temp; void main(){ //Inizializza porte TRISA = 0xff; //porta A
in input ADCON1 = 0x80; //porta A con 5 ingressi analogici TRISB = 0b11100010; //1=input
0=output //Imposta oscillatore RC a 31250 hz OSCCON.IRCF2=0; OSCCON.IRCF1=0; OSCCON.IRCF0=0;
//Impostazione Interrupt INTCON.GIE = 1; //Global Interrupt Enabled INTCON.RBIE
= 1; //Interrupt su PORTB[7:4] //Impostazioni Timer2 T2CON = 0b00001111; //timer2
on, prescaler=16, postscaler=2 -> interrupt di 1s INTCON.PEIE = 1; //Attiva interrupt
secondari PIE1.TMR2IE = 1; //Attiva interrupt Timer2 while(1){ //controllo livello
batteria temp = Adc_Read(livellobatteria); if (temp < batteriacarica &&
pompa==0){ //batteria scarica if (tempolampeggiante>=60 && lampeggiante==0)
{ lampeggiante=1; tempolampeggiante=0; } if (tempolampeggiante>=5 &&
lampeggiante==1) { lampeggiante=0; tempolampeggiante=0; } } temp = Adc_Read(assorbimento);
if (temp > maxassorbimento && pompa==1){ //assorbimento eccessivo ->
routine bloccante Delay_ms(1000); temp = Adc_Read(assorbimento); if (temp < maxassorbimento)
goto procedi; lampeggiante = 1; Delay_ms(3000); pompa=0; tempopompa=0; Delay_ms(3000);
if (max==1 || emerg==1)pompa=1; } procedi: if (tempopompa > maxtempopompaon){
lampeggiante = 1; pompa=0; tempopompa=0; Delay_ms(10000); if (max==1 || emerg==1)pompa=1;
} if (controlloaggiuntivo == 255){ if (min==0 && max==0 && emerg==0
&& pompa==1) pompa=0; //controllo aggiuntivo su spegnimento pompa if (max==1
|| emerg==1) pompa=1; } } }
|
|